package com.ftg.learn.chapter15.proxy.reflech;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;

/**
 * @author KangJx
 * @date 2021/7/29
 */
public class LearnClass {

    public void test(Cat c){
        //反射
        Class c1 = c.getClass();


        Class c2 = Cat.class;

        try {
            Class c3 = Class.forName("com.ftg.learn.chapter15.proxy.reflech.Cat");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }


    /**
     *  类容器 ： 大量实例好了的实例,
     *  ： 你是不是把类的创建权限移交了 field方法（）
     *  ：工厂类
     *  A-》 B 移交
     *  控制反转 ： ioc
     * cat里面有几个属性
     */
    public void field() {
        //完整q包地址加类名
        //异常 :
        try {
            //子类可以向上转型成为父类 这个父类可以向下转型(强制类型转换)成子类
            Class c = Class.forName("com.ftg.learn.chapter15.proxy.reflech.Cat");
            Object cat = c.newInstance();
            //公共
            Field[] fs= c.getDeclaredFields();
            int sum = 0;
            for(Field f : fs){
                AnimalId aid = f.getAnnotation(AnimalId.class);
                System.out.println(aid+"===>"+f.getName());
//                newInstance  -- 实例化s
                if(f.getName().equals("name")){
                    PropertyDescriptor p = new PropertyDescriptor(f.getName(),c);
                    //setter
                    Method writemethod =  p.getWriteMethod();
                    writemethod.invoke(cat,"丸加最");
                    Method readmethod = p.getReadMethod();
                    Object str = readmethod.invoke(cat);
                    System.out.println(str);
                }

                sum++;
            }

            System.out.println(sum);
        } catch (ClassNotFoundException e) {
            System.err.println("哥们你的类写错了");
        } catch (IntrospectionException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

}
